August 11, 2021
학생들이 각자의 과제에 대해 상호평가를 합니다. 각 학생이 자신을 포함하여 평가한 점수가 배열로 주어집니다. 이 때 각 학생이 받은 점수의 평균을 구해 학점을 반환하는 로직을 작성해야 합니다. 최종 반환하는 형식은 ‘FBC’ 와 같이 0번 학생부터 순서대로 학점을 구해 문자열로 반환합니다. 단, 학생이 자신을 평가한 점수가 유일한 최고점수 혹은 최저점수라면 평균을 구할 때 제외합니다.
| 평균 | 학점 |
|---|---|
| 90점 이상 | A |
| 80점 이상 90점 미만 | B |
| 70점 이상 80점 미만 | C |
| 50점 이상 70점 미만 | D |
| 50점 미만 | F |
scores = [
[10, 20, 30], // 0번 학생이 0번, 1번, 2번 학생을 평가한 점수
[70, 80, 90],
[100, 0, 10],
];function solution(scores) {
let answer = '';
// 평균 => 학점 변환
const getGrade = average => {
switch (true) {
case average >= 90:
return 'A';
case average >= 80:
return 'B';
case average >= 70:
return 'C';
case average >= 50:
return 'D';
default:
return 'F';
}
};
const studentLength = scores.length;
const receivedScoresListByStudent = Array.from(
{ length: studentLength },
() => []
);
// 각 학생이 받은 점수로 변환
for (let i = 0; i < studentLength; i++) {
for (let j = 0; j < studentLength; j++) {
receivedScoresListByStudent[j].push([i, scores[i][j]]);
}
}
receivedScoresListByStudent.forEach((scores, myNumber) => {
scores.sort((a, b) => b[1] - a[1]);
// 최저점수 혹은 최고점수 제외
const filterdScores = scores
.filter((_, index, thisArr) => {
if (
index === 0 &&
thisArr[index][0] === myNumber &&
thisArr[index][1] !== thisArr[index + 1][1]
)
return false;
if (
index === studentLength - 1 &&
thisArr[studentLength - 1][0] === myNumber &&
thisArr[studentLength - 1][1] !== thisArr[studentLength - 2][1]
)
return false;
return true;
})
.map(([_, score]) => score);
// 평균 계산
const average = filterdScores.reduce((acc, cur, index) => {
if (index === filterdScores.length - 1)
return (acc + cur) / filterdScores.length;
return acc + cur;
}, 0);
answer += getGrade(average);
});
return answer;
}
const scores = [
[100, 90, 98, 88, 65],
[50, 45, 99, 85, 77],
[47, 88, 95, 80, 67],
[61, 57, 100, 80, 65],
[24, 90, 94, 75, 65],
];
console.log(solution(scores) === 'FBABD');const receivedScoresListByStudent = scores.map((_, i) => {
// [scores[0][i], scores[1][i], scores[2][i]]를 반환하면 행과 열을 바꿀 수 있다.
return scores.map(score => score[i]);
});function solution(scores) {
const getGrade = average => {
switch (true) {
case average >= 90:
return 'A';
case average >= 80:
return 'B';
case average >= 70:
return 'C';
case average >= 50:
return 'D';
default:
return 'F';
}
};
const receivedScoresListByStudent = scores.map((_, i) =>
scores.map(score => score[i])
);
return receivedScoresListByStudent
.map((scores, i) => {
const myScore = scores.splice(i, 1)[0];
if (myScore > Math.max(...scores) || myScore < Math.min(...scores))
return scores;
return [myScore, ...scores];
})
.map(scores =>
getGrade(scores.reduce((acc, cur) => acc + cur, 0) / scores.length)
)
.join('');
}